// 版权所有2009年围棋作者。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package ssagen

import (
	"cmd/compile/internal/ir"
	"cmd/compile/internal/objw"
	"cmd/compile/internal/ssa"
	"cmd/compile/internal/types"
	"cmd/internal/obj"
)

var Arch ArchInfo

// 后端接口

type ArchInfo struct {
	LinkArch *obj.LinkArch

	REGSP     int
	MAXWIDTH  int64
	SoftFloat bool

	PadFrame func(int64) int64

	// ZeroRange将堆栈上的内存范围归零。它只是插入的
	// 在函数输入时，可以关闭寄存器。
	ZeroRange func(*objw.Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog

	Ginsnop      func(*objw.Progs) *obj.Prog
	Ginsnopdefer func(*objw.Progs) *obj.Prog // 退换货特别优惠

	// SSAMarkMoves标记需要避免碰撞标志的任何MOVXconst操作。
	SSAMarkMoves func(*State, *ssa.Block)

	// SSAGenValue为该值发出程序。
	SSAGenValue func(*State, *ssa.Value)

	// SSAGenBlock发出块结束程序。应调用SSAGenValue
	// 用于SSAGenBlock之前的块中的所有值。
	SSAGenBlock func(s *State, b, next *ssa.Block)

	// LoadRegresResults发出加载寄存器分配结果的指令
	// 进入登记册。它们已经在内存中（PPARAMOUT节点）。
	// 用于开放编码延迟返回路径。
	LoadRegResults func(s *State, f *ssa.Func)

	// SpillArgReg发出将reg溢出到n+关闭的指令。
	SpillArgReg func(pp *objw.Progs, p *obj.Prog, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog
}
